//package com.netty.gpt2;
//
//好的，以下是对代码的注解：
//
//        服务器端代码：
//
//        ```java
//import io.netty.bootstrap.ServerBootstrap;
//import io.netty.buffer.ByteBuf;
//import io.netty.buffer.Unpooled;
//import io.netty.channel.*;
//import io.netty.channel.nio.NioEventLoopGroup;
//import io.netty.channel.socket.SocketChannel;
//import io.netty.channel.socket.nio.NioServerSocketChannel;
//
//public class NettyServer {
//    private int port;
//
//    public NettyServer(int port) {
//        this.port = port;
//    }
//
//    public void run() throws Exception {
//        // 创建两个 EventLoopGroup 对象，一个用于处理服务器端的连接请求，一个用于处理服务器端的 I/O 操作
//        EventLoopGroup bossGroup = new NioEventLoopGroup();
//        EventLoopGroup workerGroup = new NioEventLoopGroup();
//        try {
//            // 创建 ServerBootstrap 对象
//            ServerBootstrap bootstrap = new ServerBootstrap();
//
//            // 设置 ServerBootstrap 的相关参数
//            bootstrap.group(bossGroup, workerGroup) // 指定 EventLoopGroup
//                    .channel(NioServerSocketChannel.class) // 指定服务器通道实现类
//                    .option(ChannelOption.SO_BACKLOG, 128) // 指定服务器通道参数
//                    .childOption(ChannelOption.SO_KEEPALIVE, true) // 指定客户端通道参数
//                    .childHandler(new ChannelInitializer<SocketChannel>() { // 设置处理器
//                        @Override
//                        protected void initChannel(SocketChannel socketChannel) throws Exception {
//                            socketChannel.pipeline().addLast(new NettyServerHandler()); // 添加自定义的 ChannelHandler
//                        }
//                    });
//
//            // 绑定端口号并启动服务器
//            System.out.println("Server started");
//            ChannelFuture future = bootstrap.bind(port).sync();
//
//            // 等待服务器被关闭，即不接受客户端的连接请求
//            future.channel().closeFuture().sync();
//        } finally {
//            // 关闭 EventLoopGroup 对象，释放资源
//            workerGroup.shutdownGracefully();
//            bossGroup.shutdownGracefully();
//        }
//    }
//
//    // 自定义的 ChannelHandler，用于处理从客户端接收的数据
//    private class NettyServerHandler extends io.netty.channel.ChannelInboundHandlerAdapter {
//        @Override
//        public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
//            ByteBuf buffer = (ByteBuf) msg;
//            String message = buffer.toString(io.netty.util.CharsetUtil.UTF_8);
//            System.out.println("Received message from client: " + message);
//
//            ByteBuf response = Unpooled.copiedBuffer("Server: " + message, io.netty.util.CharsetUtil.UTF_8);
//            ctx.channel().writeAndFlush(response).addListener(ChannelFutureListener.CLOSE); // 发送响应
//        }
//
//        @Override
//        public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
//            cause.printStackTrace();
//            ctx.close();
//        }
//    }
//}
//```
//
//        在服务器端代码中：
//
//        1. `EventLoopGroup`是一个多线程的I/O事件循环器，用来处理I/O操作，如接收新的客户端连接以及处理已经连接的客户端请求；
//        2. `ServerBootstrap` 是服务器端启动辅助类，用于设置服务器启动的各种参数；
//        3. `NioServerSocketChannel` 实现了服务器监听通道，TCP协议中的 ServerSocket，是服务器端 accept 新连接的通道类型；
//        4. `ChannelOption.SO_BACKLOG` 设置服务器最大连接数，128 为最大等待连接数；
//        5. `ChannelOption.SO_KEEPALIVE` 设置TCP长连接；
//        6. `ChannelInitializer` 用于为客户端的Channel进行设置；
//        7. `ctx` 表示客户端的连接上下文，是 Netty 中的 Channel 上下文，`writeAndFlush(response)` 表示向客户端发送数据，并 `addListener(ChannelFutureListener.CLOSE)` 表示发送完毕后关闭连接上下文；
//        8. `exceptionCaught` 监听本地异常和远程异常；
//
//        客户端代码：
//
//        ```java
//        import io.netty.bootstrap.Bootstrap;
//        import io.netty.buffer.ByteBuf;
//        import io.netty.buffer.Unpooled;
//        import io.netty.channel.ChannelFuture;
//        import io.netty.channel.ChannelHandlerContext;
//        import io.netty.channel.ChannelInitializer;
//        import io.netty.channel.ChannelOption;
//        import io.netty.channel.EventLoopGroup;
//        import io.netty.channel.nio.NioEventLoopGroup;
//        import io.netty.channel.socket.SocketChannel;
//        import io.netty.channel.socket.nio.NioSocket